package com.gxa.opo.hualian.unit;

import java.sql.*;

/**
 * 数据库操作的基础工具类
 * Connection
 * PreparedStatement
 * ResultSet
 */
public class DBUtil {

    private  Connection connection = null;
    private  PreparedStatement preparedStatement = null;
    private  ResultSet resultSet = null;

    private String url = null;
    private String username = null;
    private String pwd = null;
    private String driver = null;

//    使用语句块封装连接参数和驱动参数
    // 当类创建对象的时候会自动优先执行(在构造方法之前)语句块
    {
         url = "jdbc:mysql://localhost:3306/hualian?" +
                "useSSL=false&characterEncoding=utf-8&serverTimezone=UTC";
         username = "root";
         pwd = "123456";
         driver = "com.mysql.cj.jdbc.Driver";
    }

    /**
     * 建立和数据库的连接
     * url/username/pwd 数据库连接使用的基础参数应该配置在配置文件中(db.properties)
     */
    private  Connection getConnection() throws SQLException, ClassNotFoundException {
        // http://www.baidu.com:80/index.html
        // 5.7 版本和8 区别: 8必须提供时区
        // GMT: 格林威治标准时区 , 用在表示中国时间的时候: GMT+8
        //  UTC: 统一标准时区
        Class.forName(driver);
       connection = DriverManager.getConnection(url,username,pwd);
       return connection;
    }

    /**
     * 创建预编译语句对象
     * @param sql 要执行的sql命令
     * @return 执行了预编译之后的命令对象(对象全局化, 此处是否返回都可以)
     */
    public PreparedStatement createPreparedStatement(String sql) throws SQLException, ClassNotFoundException {
        preparedStatement = getConnection().prepareStatement(sql);
        return preparedStatement;
    }

    /**
     * 执行增删改的方法
     * @param preparedStatement 增删改类型的sql语句的执行命令对象
     * @return 影响的行数
     * @throws SQLException
     */
    public int execUpdate(PreparedStatement preparedStatement) throws SQLException {
        return preparedStatement.executeUpdate();
    }

    /**
     * 执行查询的方法
     * @param preparedStatement 查询类型的sql语句的执行命令对象
     * @return 返回结果集
     * @throws SQLException
     */
    public ResultSet execQuery(PreparedStatement preparedStatement) throws SQLException {
        resultSet = preparedStatement.executeQuery();
        return resultSet;
    }

    public void close() throws SQLException {

        if (resultSet != null) {
            resultSet.close();
        }
        if (preparedStatement != null) {
            preparedStatement.close();
        }
        if (connection != null) {
            connection.close();
        }
    }

}
